import axios from 'axios'
import combineURLs from 'axios/lib/helpers/combineURLs'
import qs from 'qs'
import dayjs from 'dayjs'

function Http(options) {
  const _axios = axios.create(options)

  _axios.defaults.headers.post['Content-Type'] = 'application/json'
  _axios.defaults.headers.put['Content-Type'] = 'application/json'

  // 请求前拦截器，附加令牌
  _axios.interceptors.request.use(
    (config) => {
      config.headers['grant_type'] = 'service_code'
      config.headers['appCode'] = 'workflow'
      config.headers['schoolId'] = '3a0481ab-9313-a3a2-6d48-835e78b0327a'
      return config
    },
    (error) => {
      console.error(error)
      return Promise.reject(error)
    }
  )

  // 响应前拦截器
  _axios.interceptors.response.use(
    (response) => {
      const { config } = response
      if (config.responseType && config.responseType === 'blob') {
        const url = window.URL.createObjectURL(response.data)
        // 预览模式直接返回
        if (response.config.headers['xzx_preview']) return url

        let fileName = ''
        const cd = response.headers['content-disposition']
        if (cd) {
          fileName = decodeURI(cd.split("''")[1])
        }
        // 如果文件名不存在，则使用时间戳
        if (!fileName) {
          fileName = dayjs().format('YYYYMMDDHHMMSSS')
        }
        // 通过模拟a标签点击事件下载文件
        const link = document.createElement('a')
        link.href = url
        link.setAttribute('download', fileName)
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
        return
      } else if (response.data.success) {
        return response.data.result || { success: true }
      } else if (!response.data.success) {
        return Promise.reject(response.data.message)
      } else {
        return response.data
      }
    },
    (error) => {
      if (error && error.response) {
        return Promise.reject(error)
      }
      return Promise.reject(error)
    }
  )

  this._axios = _axios
}

/**
 * POST请求
 * @param {*} url 相对路径
 * @param {*} params 参数
 * @param {*} config 自定义配置
 * @returns
 */
Http.prototype.post = function (url, params, config) {
  return this._axios.post(url, params, config)
}

/**
 * GET请求
 * @param {*} url 相对路径
 * @param {*} params 参数
 * @param {*} config 自定义配置
 * @returns
 */
Http.prototype.get = function (url, params, config) {
  const config_ = Object.assign({}, config, {
    // 参数
    params,
    // 修改参数序列化方法
    paramsSerializer: (p) => {
      // 使用逗号分隔参数
      return qs.stringify(p, {
        allowDots: true
      })
    }
  })
  return this._axios.get(url, config_)
}

/**
 * 文件下载
 * @param {*} url 相对路径
 * @param {*} params 参数
 * @param {*} config 自定义配置
 * @returns
 */
Http.prototype.download = function (url, params, config) {
  const config_ = Object.assign({ responseType: 'blob' }, config, {
    // 参数
    params,
    // 修改参数序列化方法
    paramsSerializer: (p) => {
      // 使用逗号分隔参数
      return qs.stringify(p, {
        allowDots: true
      })
    }
  })
  return this._axios.get(url, config_)
}

/**
 * 文件预览
 * @param {*} url 相对路径
 * @param {*} params 参数
 * @param {*} config 自定义配置
 * @returns
 */
Http.prototype.preview = function (url, params, config) {
  const config_ = Object.assign({ responseType: 'blob', headers: { xzx_preview: true } }, config, {
    // 参数
    params,
    // 修改参数序列化方法
    paramsSerializer: (p) => {
      // 使用逗号分隔参数
      return qs.stringify(p, {
        allowDots: true
      })
    }
  })
  return this._axios.get(url, config_)
}

/**
 * 获取完整接口地址
 * @param {*} url 相对路径
 * @returns
 */
Http.prototype.getUrl = function (url) {
  return combineURLs(this._axios.defaults.baseURL, url)
}

const request = new Http({
  baseURL: 'https://k12wx.xzxyun.com', // 本地测试用
  timeout: 30000
})

export default request
